#ifndef CHATDATABASE_H
#define CHATDATABASE_H

#include <iostream>
#include <mysql/mysql.h>
#include <string>
#include <stdio.h>
#include <random>
#include <string.h>
#include <vector>
#include <sstream>
#include <unordered_map>

// #include <jsoncpp/json/json.h>
#include "flag.h"
#include "entity.h"

using namespace std;

class ChatDatabase
{
private:
    MYSQL *mysql;
    static MYSQL_RES *get_MYSQL_RES(MYSQL *mysql, const char *sqlscript);

    void make_uid(string &);
    // 类对象实体
    static ChatDatabase *instance;

    // 记录在线用户的username和socketFd
    static unordered_map<string, int> onlineUser;

public:
    ChatDatabase();
    ~ChatDatabase();
    // 单例模式_饿汉模式
    static ChatDatabase *getInstanceChatDatabase()
    {
        if (instance != nullptr)
            return instance;
    }
    
    static void my_database_add_online_user(const string &username, int socketFd)
    {
        // 检查用户名是否已经存在
        if (onlineUser.find(username) != onlineUser.end())
        {
            cerr << "用户名: " << username << " 已存在！" << endl;
            return;
        }
        // 将用户名和套接字文件描述符添加到映射表中
        onlineUser.insert({username, socketFd});
        cout << "用户 " << username << " 已添加到在线用户列表中。" << endl;
    }
    static int my_database_get_online_user(const string &username)
    {
        auto it = onlineUser.find(username);
        if (it != onlineUser.end())
        {
            return it->second;
        }
        else
        {
            return -1; // 表示用户不存在
        }
    }
    // 连接数据库
    void my_database_connect(const char *);

    // 登录服务包括先查看用户是否存在，存在之后判断用户密码是否正确
    //  查找用户是否存在, 如果存在返回ture,通过参数返回用户uid // 获取一行或多行查询结果, 单行或单列返回1,多行多列返回2, 无数据返回0
    int my_database_get_data(vector<string> &array, const char *sqlscript);
    // 断开数据库连接
    void my_database_disconnect() { mysql_close(this->mysql); }
    // 查找用户是否存在, 如果存在返回ture,通过参数返回用户uid
    bool my_database_user_exist(const string &, string *retuid = nullptr);
    // 用户注册业务
    int my_database_user_register(string name, string password);
    // 用户登录密码验证业务
    int my_database_user_confirm(string name, string password);
    // 获取好友列表
    void my_database_get_friend_list(const string &uid, vector<UserInformation> &array);
    // 获取某个用户信息
    void my_database_get_user_info(char *uid, UserInformation *userInformation);
    // 添加好友
    // void my_database_DML_friend(string sender, string receiver, int mode);
    //根据name查询username;
    string my_database_user_username(const string& name);
    
};

#endif